package com.cn.kabalifeuser.ui.my.activity;

import android.annotation.SuppressLint;
import android.content.Context;
import android.content.Intent;
import android.content.pm.ActivityInfo;
import android.os.Bundle;
import android.util.Log;
import android.view.View;

import androidx.recyclerview.widget.GridLayoutManager;
import androidx.recyclerview.widget.RecyclerView;

import com.cn.kabalifeuser.R;
import com.cn.kabalifeuser.api.Api;
import com.cn.kabalifeuser.base.IBaseActivity;
import com.cn.kabalifeuser.callback.CacheCallBack;
import com.cn.kabalifeuser.callback.SchedulerTransformer;
import com.cn.kabalifeuser.config.Constants;
import com.cn.kabalifeuser.config.LoginHelper;
import com.cn.kabalifeuser.event.RxBus;
import com.cn.kabalifeuser.event.RxBusBean;
import com.cn.kabalifeuser.ui.my.adapter.GridImageAdapter;
import com.cn.kabalifeuser.ui.my.bean.CooperationSreviceListBean;
import com.cn.kabalifeuser.ui.my.bean.UpImgBean;
import com.cn.kabalifeuser.utils.GlideEngine;
import com.cn.kabalifeuser.utils.LoggerUtils;
import com.cn.kabalifeuser.utils.RxToast;
import com.cn.kabalifeuser.utils.StringUtil;
import com.cn.kabalifeuser.utils.TimeUtils;
import com.luck.picture.lib.PictureSelector;
import com.luck.picture.lib.config.PictureConfig;
import com.luck.picture.lib.config.PictureMimeType;
import com.luck.picture.lib.entity.LocalMedia;
import com.lzy.okgo.OkGo;
import com.lzy.okgo.model.Response;
import com.lzy.okgo.request.PostRequest;

import java.io.File;
import java.util.ArrayList;
import java.util.List;

import butterknife.BindView;
import butterknife.OnClick;
import rx.functions.Action1;

/**
 * Created by 晓林 on 2020/9/9.
 * function:
 */
public class CooperationImgActivity extends IBaseActivity<CooperationSreviceView, CooperationSrevicePresenter> implements CooperationSreviceView {
    @BindView(R.id.recyclerviewpic)
    RecyclerView recyclerviewpic;
    private List<LocalMedia> selectList = new ArrayList<>();
    private int maxSelectNum = 3;
    private GridImageAdapter adapter;
    private int themeId;
    List<String> temListPicUrl = new ArrayList<>();//临时保存图片的地址，要比对上传过的是否存在。
    List<String> strPics = new ArrayList<>();
    List<String> list = new ArrayList<>();
    List<String> listIds = new ArrayList<>();

    @Override
    protected CooperationSrevicePresenter createPresenter() {
        return new CooperationSrevicePresenter();
    }

    @Override
    protected int provideContentViewId() {
        return R.layout.activity_cooperation_img;
    }

    @Override
    public void onReLoggedIn(String msg) {
        RxToast.error(msg);
        LoginHelper.againGoToLoginActivity(getMe());
    }

    @Override
    public void onError(String msg) {
        RxToast.error(msg);
    }

    @Override
    public Context _getContext() {
        return getMe();
    }

    @Override
    public void onCooperationSreviceListSuccess(CooperationSreviceListBean bean) {

    }

    @Override
    public void onUpImgSuccess(UpImgBean bean) {
        listIds.add(bean.getResult().get(0));
    }

    @Override
    public void initView(Bundle savedInstanceState) {
        super.initView(savedInstanceState);
        setTitleBar("资质上传");
        themeId = R.style.picture_default_style;
        recyclerviewpic.setLayoutManager(new GridLayoutManager(getMe(), 3));
        adapter = new GridImageAdapter(getMe(), onAddPicClickListener,2);
        adapter.setList(selectList);
        adapter.setSelectMax(maxSelectNum);
        recyclerviewpic.setAdapter(adapter);
        adapter.setOnItemClickListener(new GridImageAdapter.OnItemClickListener() {
            @Override
            public void onItemClick(int position, View v) {
                if (selectList.size() > 0) {
                    LocalMedia media = selectList.get(position);
//                    LoggerUtils.e("这是：" + media.getPath() + media.getCompressPath() + media.getCutPath());
                    String mimeType = media.getMimeType();
                    int mediaType = PictureMimeType.getMimeType(mimeType);
                    switch (mediaType) {
                        case PictureConfig.TYPE_VIDEO:
                            // 预览视频
                            PictureSelector.create(CooperationImgActivity.this).externalPictureVideo(media.getPath());
                            break;
                        case PictureConfig.TYPE_AUDIO:
                            // 预览音频
                            PictureSelector.create(CooperationImgActivity.this).externalPictureAudio(media.getPath());
                            break;
                        default:
                            // 预览图片 可自定长按保存路径
//                        PictureWindowAnimationStyle animationStyle = new PictureWindowAnimationStyle();
//                        animationStyle.activityPreviewEnterAnimation = R.anim.picture_anim_up_in;
//                        animationStyle.activityPreviewExitAnimation = R.anim.picture_anim_down_out;
                            PictureSelector.create(CooperationImgActivity.this)
                                    .themeStyle(R.style.picture_default_style) // xml设置主题
                                    //.setPictureStyle(mPictureParameterStyle)// 动态自定义相册主题
                                    //.setPictureWindowAnimationStyle(animationStyle)// 自定义页面启动动画
                                    .setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT)// 设置相册Activity方向，不设置默认使用系统
                                    .isNotPreviewDownload(true)// 预览图片长按是否可以下载
                                    .loadImageEngine(GlideEngine.createGlideEngine())// 外部传入图片加载引擎，必传项
                                    .openExternalPreview(position, selectList);
                            break;
                    }
                }
            }
        });
        rxBusSubscription = RxBus.getDefault().toObservable(RxBusBean.class)
                .compose(new SchedulerTransformer<RxBusBean>())
                .subscribe(new Action1<RxBusBean>() {
                    @SuppressLint("WrongConstant")
                    @Override
                    public void call(RxBusBean rxBusBean) {
                        if (rxBusBean.getId() == 204 && rxBusBean.getSign() == 204) {
                            // 删除图片后才传值
                            int index = (int) rxBusBean.getObjBean();
//                            LoggerUtils.e("删除了图片收到之前集合：" + strPics.size() + "str：" + strPics.toString());
//                            LoggerUtils.e("删除了图片收到：" + index);
                            temListPicUrl.remove(index);// 删除临时集合里面的
//                            RxToast.success("这边注释掉一行代码,删除记得释放");
                            strPics.remove(index); // 删除要上传id集合里面的
//                            LoggerUtils.e("删除了图片收到之后集合：" + strPics.size() + "str：" + strPics.toString());

                        }
                    }
                });
    }

    private GridImageAdapter.onAddPicClickListener onAddPicClickListener = new GridImageAdapter.onAddPicClickListener() {
        @Override
        public void onAddPicClick() {
            // 进入相册 以下是例子：不需要的api可以不写
            PictureSelector.create(CooperationImgActivity.this)
                    .openGallery(PictureMimeType.ofImage())// 全部.PictureMimeType.ofAll()、图片.ofImage()、视频.ofVideo()、音频.ofAudio()
                    .loadImageEngine(GlideEngine.createGlideEngine())// 外部传入图片加载引擎，必传项
                    .theme(themeId)// 主题样式设置 具体参考 values/styles   用法：R.style.picture.white.style v2.3.3后 建议使用setPictureStyle()动态方式
                    .isWeChatStyle(false)// 是否开启微信图片选择风格
//                        .setLanguage(language)// 设置语言，默认中文
//                        .setPictureStyle(mPictureParameterStyle)// 动态自定义相册主题
//                        .setPictureCropStyle(mCropParameterStyle)// 动态自定义裁剪主题
//                        .setPictureWindowAnimationStyle(windowAnimationStyle)// 自定义相册启动退出动画
                    .isWithVideoImage(true)// 图片和视频是否可以同选,只在ofAll模式下有效
                    .maxSelectNum(maxSelectNum)// 最大图片选择数量
                    .minSelectNum(1)// 最小选择数量
                    //.maxVideoSelectNum(1) // 视频最大选择数量，如果没有单独设置的需求则可以不设置，同用maxSelectNum字段
                    //.minVideoSelectNum(1)// 视频最小选择数量，如果没有单独设置的需求则可以不设置，同用minSelectNum字段
                    .imageSpanCount(3)// 每行显示个数
                    .isReturnEmpty(false)// 未选择数据时点击按钮是否可以返回
                    //.isAndroidQTransform(false)// 是否需要处理Android Q 拷贝至应用沙盒的操作，只针对compress(false); && enableCrop(false);有效,默认处理
                    .setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT)// 设置相册Activity方向，不设置默认使用系统
                    .isOriginalImageControl(false)// 是否显示原图控制按钮，如果设置为true则用户可以自由选择是否使用原图，压缩、裁剪功能将会失效
                    //.cameraFileName("test.png")    // 重命名拍照文件名、注意这个只在使用相机时可以使用，如果使用相机又开启了压缩或裁剪 需要配合压缩和裁剪文件名api
                    //.renameCompressFile("test.png")// 重命名压缩文件名、 注意这个不要重复，只适用于单张图压缩使用
                    //.renameCropFileName("test.png")// 重命名裁剪文件名、 注意这个不要重复，只适用于单张图裁剪使用
                    .selectionMode(
                            PictureConfig.MULTIPLE)// 多选 or 单选
                    .isSingleDirectReturn(false)// 单选模式下是否直接返回，PictureConfig.SINGLE模式下有效
                    .previewImage(true)// 是否可预览图片
                    .previewVideo(false)// 是否可预览视频
                    //.querySpecifiedFormatSuffix(PictureMimeType.ofJPEG())// 查询指定后缀格式资源
                    .enablePreviewAudio(false) // 是否可播放音频
                    .isCamera(true)// 是否显示拍照按钮
                    //.isMultipleSkipCrop(false)// 多图裁剪时是否支持跳过，默认支持
                    .isZoomAnim(true)// 图片列表点击 缩放效果 默认true
                    //.imageFormat(PictureMimeType.PNG)// 拍照保存图片格式后缀,默认jpeg
                    .enableCrop(false)// 是否裁剪
                    .compress(true)// 是否压缩
                    .compressQuality(80)// 图片压缩后输出质量 0~ 100
                    .synOrAsy(true)//同步false或异步true 压缩 默认同步
                    //.queryMaxFileSize(10)// 只查多少M以内的图片、视频、音频  单位M
                    //.compressSavePath(getPath())//压缩图片保存地址
                    //.sizeMultiplier(0.5f)// glide 加载图片大小 0~1之间 如设置 .glideOverride()无效 注：已废弃
                    //.glideOverride(160, 160)// glide 加载宽高，越小图片列表越流畅，但会影响列表图片浏览的清晰度 注：已废弃
//                        .withAspectRatio(aspect_ratio_x, aspect_ratio_y)// 裁剪比例 如16:9 3:2 3:4 1:1 可自定义
//                        .hideBottomControls(cb_hide.isChecked() ? false : true)// 是否显示uCrop工具栏，默认不显示
                    .isGif(false)// 是否显示gif图片
//                        .freeStyleCropEnabled(cb_styleCrop.isChecked())// 裁剪框是否可拖拽
//                        .circleDimmedLayer(cb_crop_circular.isChecked())// 是否圆形裁剪
                    //.setCircleDimmedColor(ContextCompat.getColor(this, R.color.app_color_white))// 设置圆形裁剪背景色值
                    //.setCircleDimmedBorderColor(ContextCompat.getColor(getApplicationContext(), R.color.app_color_white))// 设置圆形裁剪边框色值
                    //.setCircleStrokeWidth(3)// 设置圆形裁剪边框粗细
//                        .showCropFrame(cb_showCropFrame.isChecked())// 是否显示裁剪矩形边框 圆形裁剪时建议设为false
//                        .showCropGrid(cb_showCropGrid.isChecked())// 是否显示裁剪矩形网格 圆形裁剪时建议设为false
                    .openClickSound(true)// 是否开启点击声音
                    .selectionMedia(selectList)// 是否传入已选图片
                    //.isDragFrame(false)// 是否可拖动裁剪框(固定)
//                        .videoMaxSecond(15)
//                        .videoMinSecond(10)
                    //.previewEggs(false)// 预览图片时 是否增强左右滑动图片体验(图片滑动一半即可看到上一张是否选中)
                    //.cropCompressQuality(90)// 注：已废弃 改用cutOutQuality()
                    .cutOutQuality(90)// 裁剪输出质量 默认100
                    .minimumCompressSize(100)// 小于100kb的图片不压缩
                    //.cropWH()// 裁剪宽高比，设置如果大于图片本身宽高则无效
                    //.rotateEnabled(true) // 裁剪是否可旋转图片
                    //.scaleEnabled(true)// 裁剪是否可放大缩小图片
                    //.videoQuality()// 视频录制质量 0 or 1
                    //.videoSecond()//显示多少秒以内的视频or音频也可适用
                    //.recordVideoSecond()//录制视频秒数 默认60s
                    //.setOutputCameraPath("/CustomPath")// 自定义拍照保存路径  注：已废弃
                    .forResult(PictureConfig.CHOOSE_REQUEST);//结果回调onActivityResult code
        }

    };

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        switch (resultCode) {
            case RESULT_OK:
                switch (requestCode) {
                    case PictureConfig.CHOOSE_REQUEST:
                        // 图片选择结果回调
//                        List<LocalMedia> result = data.getParcelableArrayListExtra(PictureConfig.EXTRA_RESULT_SELECTION);
//                        for (LocalMedia b : result) {
//                            LoggerUtils.e("返回：" + b.getPath());
//                        }
                        selectList = PictureSelector.obtainMultipleResult(data);
                        // 例如 LocalMedia 里面返回五种path
                        // 1.media.getPath(); 为原图path
                        // 2.media.getCutPath();为裁剪后path，需判断media.isCut();是否为true
                        // 3.media.getCompressPath();为压缩后path，需判断media.isCompressed();是否为true
                        // 4.media.getOriginalPath()); media.isOriginal());为true时此字段才有值
                        // 5.media.getAndroidQToPath();为Android Q版本特有返回的字段，此字段有值就用来做上传使用
                        // 如果同时开启裁剪和压缩，则取压缩路径为准因为是先裁剪后压缩
                        adapter.setList(selectList);
                        adapter.notifyDataSetChanged();
                        if (temListPicUrl.size() > 0) {
                            for (LocalMedia media : selectList) {
                                Log.i("压缩:", media.getCompressPath());
                                if (temListPicUrl.contains(media.getCompressPath())) {
                                    //如果存在 不管
                                } else {
                                    //如果不存在的话就添加和上传上传
                                    temListPicUrl.add(media.getCompressPath());
                                    mPresenter.onUpImgData(media.getCompressPath());
                                }
                            }
                        } else {
                            //temListPicUrl如果没有数据就说明是 第一次添加 第一次上传
//                            for (LocalMedia media : selectList) {
//                                //todo 上传
//                                temListPicUrl.add(media.getCompressPath());
//                                LoggerUtils.e("上传的图片："+selectList.get());
//                                mPresenter.onUpImgData(media.getCompressPath());
//                            }

                            for (int i = 0; i < selectList.size(); i++) {
                                temListPicUrl.add(selectList.get(i).getCompressPath());
//                                LoggerUtils.e("上传的图片：" +i+"地址："+ selectList.get(i).getCompressPath());
//                                mPresenter.onUpImgData(selectList.get(i).getCompressPath());
                                list.add(selectList.get(i).getCompressPath());

                            }
                            upAdFile();
                        }
                        break;

                }
                break;
        }
    }

    private void upAdFile() {
        if (list.size() > 0) {
            String time = TimeUtils.getTime10();
            PostRequest postRequest = OkGo.<UpImgBean>post(Api.API_UP_IMG);
            postRequest.params("type", "head");
            postRequest.params("file[]", new File(list.get(0)));
            postRequest.execute(new CacheCallBack<UpImgBean>() {
                @Override
                public void onSuccess(Response<UpImgBean> response) {
                    super.onSuccess(response);
                    UpImgBean bean = response.body();
                    if (bean.getCode() == Constants.HTTP_SUCCESS) {
                        strPics.add(bean.getMsg() + "/" + bean.getResult().get(0));
                        listIds.add(bean.getResult().get(0));
//                        LoggerUtils.e("图片的id：" + bean.getData().getId() + "图片的链接;" + bean.getData().getOriginal());
                        list.remove(0);
                        upAdFile();
                    } else if (bean.getCode() == Constants.HTTP_AGAIN_LOGIN) {
                        onReLoggedIn(response.body().getMsg());
                    } else {
                        RxToast.error(bean.getMsg());
                        list.remove(0);
                        upAdFile();
                    }

                }
            });
        }
    }

    @OnClick(R.id.tv_btn_next)
    public void onViewClicked() {
        LoggerUtils.e("上传" + listIds.size());

        if (listIds.size() > 0) {
            Intent intent = new Intent();
            intent.putExtra("idsImgStr", StringUtil.convertListToString(listIds));
            intent.putExtra("idsImg", listIds.size());
            setResult(1011, intent);
            finish();
        } else {
            RxToast.error("请上传资质图片");
        }
    }
}
